/*
 * Copyright 2008 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import jp.co.cij.grails.validation.InterimDomainClassValidator

import org.codehaus.groovy.grails.commons.GrailsClassUtils as GCU
import org.codehaus.groovy.grails.validation.ConstrainedPropertyBuilder

class InterimGrailsPlugin {
    def version = 0.1
    def dependsOn = [hibernate:grails.util.GrailsUtil.getGrailsVersion()]

    // TODO Fill in these fields
    def author = "Shiro Kasahara"
    def authorEmail = "kasahara.shiro@gmail.com"
    def title = "Plugin summary/headline"
    def description = '''\
Brief description of the plugin.
'''

    // URL to the plugin's documentation
    def documentation = "http://grails.org/Interim+Plugin"

    def doWithSpring = {
        application.domainClasses.each {dc ->
            def clazz = dc.clazz
            def closure = GCU.getStaticPropertyValue(clazz, 'additionalConstraints')
            if (dc.hasPersistentProperty("interim") && closure) {
                def builder = new ConstrainedPropertyBuilder(clazz.newInstance())
                closure.setDelegate(builder)
                closure()
                "${dc.fullName}Validator"(InterimDomainClassValidator) {
                    messageSource = ref("messageSource")
                    domainClass = ref("${dc.fullName}DomainClass")
                    additionalConstraints = builder.constrainedProperties
                }
            }
        }
    }

    def doWithApplicationContext = { applicationContext ->
        // TODO Implement post initialization spring config (optional)
    }

    def doWithWebDescriptor = { xml ->
        // TODO Implement additions to web.xml (optional)
    }

    def doWithDynamicMethods = { ctx ->
        // TODO Implement registering dynamic methods to classes (optional)
    }

    def onChange = { event ->
        // TODO Implement code that is executed when any artefact that this plugin is
        // watching is modified and reloaded. The event contains: event.source,
        // event.application, event.manager, event.ctx, and event.plugin.
    }

    def onConfigChange = { event ->
        // TODO Implement code that is executed when the project configuration changes.
        // The event is the same as for 'onChange'.
    }

}
